package com.lovi.reflect;

import java.io.FileInputStream;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.util.Properties;

/**
 * 反射引入
 * 需求，读取配置文件
 */
public class Test01 {
    public static void main(String[] args) throws Exception {
        //传统方法
//        Cat cat = new Cat("糯米");
//        cat.cry();
        /*
         缺点，任意创造对象，执行方法，都要改源码，不方便
         */
        //读取配置文件
        Properties properties = new Properties();
        properties.load(new FileInputStream("src/main/resources/animal.properties"));
        String classFullName = (String) properties.get("classFullName");
        String methodName = (String) properties.get("methodName");
        System.out.println(classFullName);
        System.out.println(methodName);
        /*
         像是：new classFullName()肯定不不行的，编译不会通过，所以我们引入反射
         */

        /**
         * 01.构造函数无参数的情况下
         */
        Class cls = Class.forName(classFullName);
        //        Object o = cls.newInstance();
        Constructor constructor = cls.getConstructor(String.class);
        Object o1 = constructor.newInstance("糯米");
//        System.out.println("o的运行类型："+o.getClass());//小猫，动态绑定
        //执行方法,首先获取方法
        Method method = cls.getMethod(methodName);
        //方法执行
        method.invoke(o1);
    }

}
class Cat{
    private String name;

    public Cat() {
    }

    public Cat(String name) {
        this.name = name;
    }
    public void cry(){
        System.out.println(name + "在喵喵叫~");
    }
    public void sleep(){
        System.out.println(name + "在睡觉zzzzz");
    }

}


class Dog{
    private String name;
    public Dog(String name) {
        this.name = name;
    }

    public Dog() {
    }

    public void cry(){
        System.out.println(name + "在汪汪叫~");
    }
    public void sleep(){
        System.out.println(name + "在睡觉zzzzz");
    }
}
